package com.nuc.bigdata.util;


import org.apache.tomcat.util.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

/**
 * @author JackLuo
 * @date 2019/10/18
 */
public class CryptUtils {
    private final static String ALGORITHM_MODE = "AES";

    private String key;
    private String algorithm;
    private SecretKeySpec secretKeySpec;

    public CryptUtils(String key, String algorithm) throws Exception {
        this.key = key;
        this.algorithm = algorithm;
        // 1. 构造密钥生成器，指定为AES算法
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM_MODE);
        // 2. 根据用户自定义密钥对应的字节数组，生成一个128位的随机源（只能是128 or 192 or 256中的一个）
        keyGenerator.init(128, new SecureRandom(key.getBytes()));
        // 3. 生成AES算法的原始对称密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 4. 获取原始对称密钥的字节数组
        byte[] enCodeFormat = secretKey.getEncoded();

        // 5. 根据字节数组生成AES密钥
        this.secretKeySpec = new SecretKeySpec(enCodeFormat,ALGORITHM_MODE);
    }


    /**
     * 加密操作，在此之前必须进行init操作
     * @param message 需要加密的信息
     * @return 加密之后的信息
     * @throws Exception
     */
    public String encrypt(String message) throws Exception{
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec );
        byte[] content = message.getBytes();
        byte[] result = cipher.doFinal(content);
        return Base64.encodeBase64String(result);
    }

    /**
     * 解密操作，在此之前也必须进行init操作
     * @param message 需要解密的信息
     * @return 解密之后的信息
     * @throws Exception
     */
    public String decrypt(String message) throws Exception{
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.DECRYPT_MODE,secretKeySpec );
        byte[] content=Base64.decodeBase64(message);
        byte[] result = cipher.doFinal(content);
        return new String(result);
    }
}
